<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 数组 扁平化  拉平、降维 、多维转一维
        let arr =[11,22,[33,44,[55,66]]];   // [11,22,33,44,55,66]
        // console.log("es5 flat" ,arr.flat(Infinity) );
       //1.递归    
        // function myFlat(arr){
        //    let xx=[]
        //     for(var v of arr){
        //         if( Array.isArray(v) ){
        //             xx.push.apply(xx,myFlat(v))
        //         }else{
        //             xx.push(v)                  
        //         }
        //     }
        //    return xx;
        // }
        // console.log( myFlat(arr) );
        //2.递归
        //  let xx=[]
        //    function myFlat(arr){
        //     for(var v of arr){
        //         if( Array.isArray(v) ){
        //             myFlat(v)
        //         }else{
        //             xx.push(v)                  
        //         }
        //     }
        //    return xx;
        // }
        // console.log( myFlat(arr) );
        //3. 多维数组
            // function getNewArr(arr) {
            //     // 定义新数组用于存储所有元素
            //     var newArr = []
            //     // 遍历原数组中的每个元素
            //     for (var i = 0; i < arr.length; i++) {
            //         // 判断当前元素是否为数组
            //         if (Array.isArray(arr[i])) {
            //             // 若当前元素为数组时，调用函数本身继续判断，通过 concat 方法连接函数返回的数组
            //             newArr = newArr.concat(getNewArr(arr[i]))
            //         } else { // 若不是数组直接将当前元素追加到新数组的末尾
            //             newArr.push(arr[i])
            //         }
            //     }
            //     return newArr
            // }
            // console.log(getNewArr(arr)) // [1, 2, 8, 6, 7, 3, 3, 6, 9, 4]

        // 正则匹配替换
        // var str= JSON.stringify( arr );
        // console.log(str); // [11,22,[33,44,[55,66]]]
        // var str2= str.replace( /\[|\]/g,'' ) // 11,22,33,44,55,66
        // str2='['+str2+']';  // [11,22,33,44,55,66]
        // console.log(JSON.parse( str2 ));
    //toString split map 就是必须是数字
            // function getNewArr(arr) {
            //     var newArr = arr.toString().split(',').map(function (item) {
            //         // 使用 + 号将当前元素转成数字
            //         return +item
            //     })

            //     return newArr
            // }
            // console.log(getNewArr(arr)) 
        //   ES6中的 … 运算符 ... 运算符只能解构一层数组
                // function getNewArr(arr) {
                //     // 循环数组中的元素判断元素是否为数组
                //     while (arr.some(item => Array.isArray(item))) {
                //         // 解构数组
                //         arr = [].concat(...arr)
                //     }

                //     return arr
                // }
                // console.log(getNewArr(arr)) // [1, 2, 8, 6, 7, 3, 3, 6, 9, 4]

    //   reduce
    // let arr = [[0, 1], [2, 3], [4, [5, 6, 7]]]
        const newArr = function (arr) {
            return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur), [])
        }
        console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

    </script>
</body>
</html>